#include <stdio.h>
#include <string.h>

#include<unistd.h>

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

// 重定向的学习
int main()
{
    umask(0);
    // int fd = open("log.txt", O_WRONLY|O_CREAT, 0666);
    int fd = open("log.txt", O_WRONLY|O_CREAT|O_APPEND, 0666);
    dup2(fd, 1);
    printf("hello hahaha\n");
    return 0;
}












// fd的分配规则
//int main()
//{
//    close(1);
//    // int fd = open("log.txt", O_RDONLY);
//    int fd = open("log.txt", O_WRONLY|O_CREAT);
//
//    if(fd < 0)
//    {
//        perror("open");
//        return 1;
//    }
//
//    printf("fd:%d\n",fd);
//
//    return 0;
//}


//// 学习 stdin,stdout,stderr  用open函数来深刻的学习理解三个输入输出流，以及fd
//int main()
//{
//    umask(0);
//    int fd = open("log.txt", O_RDONLY);
//    // 用于重定向
//    dup2(fd, 0);    // int dup2(int oldfd, int newfd);
//    char buffer[1024];
//  
//    while(1)
//    {
//         // 默认情况下，stdin键盘中读取，默认是要阻塞
//        char* s = fgets(buffer, sizeof(buffer), stdin);
//        if(s == NULL) break;
//        printf("file content: %s",buffer);
//    }
//
//    return 0;
//}
//
//int main()
//{
//    printf("%d\n",stdin);
//    printf("%d\n",stdout);
//    printf("%d\n",stderr);
//    return 0;
//}

// 输出信息到显示器，你有哪些办法
//int main()
//{
//    const char* str = "hello file\n";
//
//    printf("%s\n",str);
//
//    fprintf(stdout, "%s\n", str);
//
//    fwrite(str, strlen(str), 1, stdout);
//
//    return 0;
//}

// 练习打开文件
//int main()
//{
//    // 写文件
//    FILE* fp = fopen("log.txt","w");
//    if(!fp)
//    {
//        printf("fopen error!\n");
//    }
//    const char *str = "hello file!\n";
//    int count = 10;
//    while(count--)
//    {
//        fwrite(str, strlen(str), 1, fp);
//    }
//    fclose(fp);
//    return 0;
//}


// 读出文件
//int main()
//{
//    FILE* fp = fopen("log.txt", "r");
//    if(!fp)
//    {
//        printf("fopen error!\n");
//    }
//
//    const char *str = "hello file!\n";
//    char buf[1024];
//    while(1)
//    {
//        size_t re = fread(buf, 1, strlen(str), fp);
//
//        if(re > 0)
//        {
//          buf[re] = 0;
//          printf("%s\n",buf);
//        }
//        else if(feof(fp))
//        {
//          break;
//        }
//    }
//
//    fopen("log.txt","w");
//    return 0;
//}

//int main()
//{
//    FILE* fp = fopen("myfile", "r");
//    if (!fp)
//    {
//        printf("fopen error\n");
//    }
//
//    char buffer[1024];
//    while(1){
//
//        size_t s = fread(buffer, 1, sizeof(buffer), fp);
//        // fread()这个函数的返回值有坑，需要注意了
//        // fread函数的返回值是成功读取的元素总数，如果返回值小于count，则可能发生了错误或者到达了文件末尾。需要注意的是，fread函数不区分文件末尾和错误，因此调用者必须使用feof和ferror函数来判断发生了什么
//        // size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );
//        // Reads an array of count elements, each one with a size of size bytes, from the stream and stores them in the block of memory specified by ptr. 
//        if(s > 0)
//        {
//            buffer[s] = 0;
//            printf("%s",buffer);
//        }
//        if(feof(fp))
//        {
//          break;
//        }
//    }
//    fclose(fp);
//}
//
//

// 写入文件
//int main()
//{
//    FILE* fp = fopen("myfile", "w");
//    if (!fp)
//    {
//        printf("file open error\n");
//    }
//
//    const char* str = "hello file!\n";
//    int count = 5;
//    while (count)
//    {
//        fwrite(str, strlen(str), 1, fp);
//        count--;
//    }
//
//    fclose(fp);
//}
